perm filename OPARRY[4,KMC]10 blob
sn#084593 filedate 1974-01-28 generic text, type T, neo UTF8
00100 BEGIN
00200
00300 % ##### PARANOID MODEL ##### %
00400
00500
00600 NEW POINTERS, DELNO, LASTSTMT, DELFLAG, FLARE, FLAG, FLARELIST, REMARK,
00700 WEIGHT, DELAY, NREF, QWORD, GLOBX, GLOBY, TERMIN, RESTSENT, ANGER, FEAR, MISTRUST, ANGER0, FEAR0,
00800 MISTRUST0, TRACEV, DLIM, SUPPRESS, SENSITIVELIST, DELNLIST, DELVLIST, DELALIST, LIVEFLARES,
00900 LASTTOP, DEADFLARES, X, REST, SKEP, DELEND, AJUMP, FJUMP, TELL, NLIST, TVAL, SACTS, WEAK, INTERPERS,
01000 EOF, MESSAGE, ENDE, TALK, SAVE_FILE;
01100
01200 SPECIAL POINTERS, DELNO, LASTSTMT, DELFLAG, FLARE,
01300 SENSITIVELIST, FLAG, FLARELIST, WEIGHT, DELAY, NREF, QWORD, GLOBX, GLOBY,
01400 TERMIN, RESTSENT, ANGER, FEAR, MISTRUST, ANGER0, FEAR0, MISTRUST0, SUPPRESS,
01500 TRACEV, X, DLIM, DELNLIST, DELVLIST, DELALIST, LIVEFLARES, DEADFLARES, DELEND, SKEP, REST,
01600 LASTTOP, AJUMP, FJUMP, TELL, NLIST, TVAL, SACTS, WEAK, INTERPERS,
01700 EOF, MESSAGE, ENDE, TALK, SAVE_FILE, FILE1, FILE2, REMARK, CHAR;
01800 %ALOOCATIONS FOR RECONSTRUCTING PARRY
01900 R LISP 39
02000 FULL WORDS=3300
02100 BINARY PROGRAM SPACE=12000 %
02200 %THE FOLLOWING FUNCTION IS TO FIX OCTAL-DECIMAL PROBLEM %
02300
02400 FEXPR LAPIN (L);
02500 BEGIN NEW IBASE; SPECIAL IBASE;
02600 IBASE←8;
02700 RETURN EVAL ('DSKIN CONS L);
02800 END;
02900
03000
03100 % ***** MAIN FUNCTIONS ***** %
03200
03300
03400 %
03500 INITIALIZE %
03600
03700 EXPR INITIALIZE ();
03800 BEGIN
03900 NEW VALUE,I, CONCEPT, WORD, SL, FL, DN, DV, AN, AV, ANV, AL, QL, RL, WTS, WT;
04000 SPECIAL VALUE, CONCEPT, WORD, SL, FL, DN, DV, AN, AV, ANV, AL, QL, RL, WTS, WT;
04100
04200 INITFN 'RESTART;
04300 IF ¬GET('SEND_MAIL,'SUBR) THEN % MAKE SURE THE DATA HAS BEEN READ IN. %
04400 BEGIN
04500 EVAL '(INC (INPUT (4 KMC) RDATA) NIL);
04600 WHILE NOT ATOM X ← ERRSET(READ(),T) DO EVAL CAR X;
04700 INC(NIL,T);
04800 END;
04900
05000 NLIST←GET ('NEGS, 'IND); % NEGATORS %
05100 SACTS←GET ('SACTS, 'IND); % META-ACTS, E.G. 'THINK' %
05200 I←0; % INDEX INTO SET OF REPLIES %
05300 DELNO←0; % CURRENT DELUSION-NUMBER %
05400 FLARE←'INIT; % FLARE=CURRENT FLARE TOPIC;
05500 'INIT = NONE %
05600 LIVEFLARES←GET ('FLARELIST, 'SETS); % FLARES NOT YET DISCUSSED %
05700 SENSITIVELIST←GET ('SENSITIVELIST, 'SETS); % SENSITIVE TOPICS %
05800 DELNLIST←GET ('DELWDS, 'NOUNS); % DELUSION TOPICS %
05900 DELVLIST←GET ('DELWDS, 'VERBS);
06000 DELALIST←GET ('DELWDS, 'AMBIG); % DELUSION TOPICS ABOVE A CERTAIN THRESHOLD OF MISTRUST %
06100
06200 % DLIM IS THE NUMBER OF "MORE GENERAL" DELUSIONS
06300 CURRENTLY IN THE PROGRAM %
06400
06500 DLIM←6;
06600
06700 % LASTTOP = LAST MAIN SELF-TOPIC DISCUSSED AND NOT LEFT;
06800 QWORD = PRESENT OR MOST RECENT KEYWORD TOPIC %
06900
07000 LASTTOP←QWORD←'INTROTOP;
07100 TERPRI NIL;
07200 PRINTSTR ("END INPUT PARAMETERS WITH CARRIAGE RETURN OR ALTMODE");
07300 TERPRI NIL;
07400 PRINTSTR ("SUPPRESS NON VERBAL FEATURE? [Y,N]");
07500 SUPPRESS←IF READ () = 'Y THEN T ELSE NIL;
07600 TERPRI NIL;
07700 % COMMENT - TO RESTORE WEAK VERSION, JUST REMOVE FIRST
07800 PRINTSTR ("VERSION [WEAK, STRONG]");
07900 IF READ () EQ 'WEAK THEN
08000 BEGIN
08100 WEAK←T;
08200 ANGER←ANGER0←FEAR←FEAR0←MISTRUST←MISTRUST0←0;
08300 END
08400 ELSE
08500 BEGIN
08600 TERPRI NIL;
08700 AND LAST LINES OF THIS COMMENT AND DONT FORGET `END' BELOW %
08800 PRINTSTR ("ANGER [LOW, MILD]");
08900 ANGER←(ANGER0←IF READ () = 'LOW THEN 0 ELSE 10);
09000 TERPRI NIL;
09100 PRINTSTR ("FEAR [LOW, MILD]");
09200 FEAR←(FEAR0←IF READ () = 'LOW THEN 0 ELSE 10);
09300 TERPRI NIL;
09400 PRINTSTR ("MISTRUST [MILD, HIGH]");
09500 MISTRUST←(MISTRUST0←IF READ () EQ 'MILD THEN 0 ELSE 15);
09600 % END; %
09700 TERPRI NIL;
09800 PRINTSTR ("TRACE VARIABLES? [Y,N]");
09900 IF READ () = 'Y THEN TRACEV←T;
10000
10100 EOF←PERCENT;
10200 PRINTSTR TERPRI "ARE TWO TELETYPES BEING USED? [Y,N]";
10300 IF READ () EQ 'Y THEN
10400 BEGIN
10500 TALK←T;
10600 PRINTSTR TERPRI "WHAT DISK FILE DO YOU WANT THIS INTERVIEW SAVED ON? (5 LETTERS ONLY)";
10700 FILE1 ← READ() CONS 'DIA;
10800 FILE2 ← AT(SUBSTR(FILE1,1,5) CAT "A") CONS 'DIA; % OUTPUT ALTERNATES BETWEEN THESE TWO. %
10900 OUT(FILE1, NIL, T); % INITIALIZATION %
11000 END
11100 ELSE
11200 BEGIN
11300 SAVE_FILE ← T;
11400 EVAL '(INPUT (4 KMC) (PAR.FIL));
11500 INC(T,NIL);
11600 FILE1←AT("X" CAT (I←READ()));
11700 INC(NIL,T);
11800 EVAL '(OUTPUT (4 KMC) (PAR.FIL));
11900 OUTC(T,NIL);
12000 PRINT(I+1);
12100 OUTC(NIL,T);
12200 OUT(FILE1 CONS 'DIA, NIL, T);
12300 FILE2←AT(FILE1 CAT "A") CONS 'DIA;
12400 FILE1←FILE1 CONS 'DIA;
12500 END;
12600
12700 END;
12800
12900
13000 %
13100 ANGERMODE PROVIDES RESPONSES FOR HIGH ANGER LEVEL %
13200
13300 EXPR ANGERMODE ();
13400 IF ANGER GREATERP 17.5 THEN PROG2 (TERPRI NIL, SAY (CHOOSE ('ANGER)))
13500 ELSE PROG2 (TERPRI NIL, SAY (CHOOSE ('HOSTILEREPLIES)));
13600
13700 %
13800 CHECKFLARE SCANS THE INPUT SENTENCE FOR THE FLARE WORD WHICH HAS THE
13900 HIGHEST WEIGHT %
14000
14100 EXPR CHECKFLARE (INP, FLARELIST);
14200 BEGIN
14300 NEW NFLARE, WORD, FSET, WT, RESULT;
14400
14500 % DISTINGUISH FLARES FOUND WITHIN THE STATEMENT (NFLARE)
14600 FROM MOST RECENT FLARE (FLARE) %
14700
14800 NFLARE←'INIT; % GET ('INIT, 'WT) = 0 %
14900
15000 % SCAN INPUT FOR FLARES AND CHECK WHETHER WEIGHT IS
15100 GREATER THAN ANY PRECEDING FLARES IN INPUT %
15200
15300 FOR WORD IN INP DO
15400 IF (FSET←GET (WORD, 'SET)) MEMBER (FLARELIST) THEN
15500 IF (WT←GET (FSET, 'WT)) GREATERP GET (GET (NFLARE, 'SET), 'WT) THEN
15600 PROG2 (NFLARE←WORD, RESULT←T);
15700 IF RESULT THEN
15800
15900 % IF FLARE ALREADY BEING DISCUSSED, DISREGARD ANY
16000 VERY WEAK NEW FLARE %
16100
16200 IF NOT (FLARE = 'INIT) AND NOT ((WT←GET (GET (NFLARE, 'SET), 'WT)) GREATERP 1) THEN
16300 RESULT←NIL
16400 ELSE
16500 BEGIN
16600 FLARE←NFLARE;
16700 WEIGHT←WT; % USED IN COMPUTING RISE IN FEAR %
16800 END;
16900
17000 RETURN (RESULT);
17100
17200 END;
17300
17400 %
17500 DELREF SCANS THE INPUT SENTENCE FOR THE FIRST DIRECT REFERENCE TO 'SELF'S
17600 DELUSIONAL COMPLEX AND RETURNS A FEARFUL REACTION. IF NO SUCH REFERENCE
17700 IS FOUND, NIL IS RETURNED. %
17800
17900 EXPR DELREF (INP);
18000 BEGIN
18100 NEW WORD, FOUND;
18200 FOUND←DELCHECK (INP);
18300
18400 IF FOUND THEN
18500 BEGIN
18600 IF DELFLAG THEN
18700
18800 % IF DELUSIONS ALREADY BEING DISCUSSED, THEN
18900 DISTINGUISH BETWEEN "STRONG" AND "AMBIGUOUS" DELUSIONAL TOPICS
19000 IN COMPUTING RISE IN FEAR %
19100
19200 IF GET (CAR (FOUND), 'STRONG) THEN FJUMP←0.4
19300 ELSE FJUMP←0.2
19400 ELSE
19500 BEGIN
19600 FJUMP←0.5;
19700
19800 % 'MAFIA' TOPIC NO LONGEV INDUCES FEARFUL REACTION,
19900 SINCE DELUSION DISCUSSION HAS ALREADY BEEN EVOKED %
20000
20100 DELNLIST←DELETE ('MAFIA, DELNLIST);
20200
20300 % MODIFY FLARE STRUCTURES TO NOTE THAT 'MAFIA' TOPIC
20400 HAS ALREADY BEEN BROUGHT UP %
20500
20600 FLMOD ('MAFIASET);
20700 END;
20800
20900 % SET (OR KEEP) DELUSION FLAG = T UNLESS 'SELF HAS
21000 FINISHED DISCUSSION DELUSIONS %
21100
21200 IF NOT DELEND THEN DELFLAG←T;
21300
21400 % RESET SO THAT FLARES OF LOWER PRIORITY THAN THOSE WHICH
21500 MAY HAVE BEEN PREVIOUSLY MENTIONED ARE RECOGNIZED %
21600
21700 FLARE←'INIT;
21800 SAY (DELSTMT ());
21900
22000 % FORGET ABOUT RECENTLY DISCUSSED SELF-TOPICS %
22100
22200 LASTTOP←QWORD←'INTROTOP;
22300 END
22400 ELSE
22500 IF ('MAFIA % I.E. AS ALREADY USED DEL WD %
22600 MEMBER INP) THEN
22700
22800 % IF 'OTHER WANTS TO TALK ABOUT 'MAFIA' AFTER 'SELF HAS
22900 FINISHED DISCUSSING DELUSIONS, REJECT TOPIC %
23000
23100 IF DELEND THEN SAY (FOUND←CHOOSE ('MAFIASET))
23200 ELSE SAY (FOUND←DELSTMT ());
23300 RETURN (FOUND);
23400 END;
23500
23600 %
23700 DELSTMT CAUSES THE "NEXT" DELUSION TO BE EXPRESSED %
23800
23900 EXPR DELSTMT ();
24000 BEGIN
24100 NEW STMT; SPECIAL STMT;
24200
24300 % IN WEAK VEVSION, TALK ABOUT RACKETS RATHER THAN MAFIA %
24400
24500 IF WEAK THEN RETURN FLSTMT ('RACKETSET);
24600
24700 % IF 'SELF HAS ALREADY EXPRESSED ALL HIS DELUSIONS, HE REFERS TO
24800 PREVIOUSLY MENTIONED ONES UP TO 3 TIMES TOTAL %
24900
25000 IF DELNO = DLIM THEN DELNO←1
25100 ELSE DELNO←DELNO + 1;
25200 IF (FEAR GREATERP 18) OR (ANGER GREATERP 18) OR ((FEAR+ANGER+MISTRUST) GREATERP 50) THEN
25300 RETURN (PROG2 (DELFLAG←NIL, CHOOSE ('CHANGESUBJ)));
25400 DELFLAG←T;
25500 FLARE←'INIT;
25600
25700 % SELECT DELUSION %
25800
25900 STMT←CHOOSEDEL (DELNO);
26000
26100 % IF STMT CONTAINS DELUSIONAL FLARE, DELETE AS SUCH %
26200
26300 DELCHECK (STMT);
26400
26500
26600 % REMEMBER THE DELUSIONAL STATEMENT TO WHICH 'OTHER IS ABOUT TO RESPOND %
26700
26800 LASTSTMT←AT ("DEL" CAT DELNO);
26900 RETURN (STMT);
27000 END;
27100
27200 %
27300 DELTALK PRODUCES RESPONSE OF 'SELF IN CONTEXT OF EXPRESSION OF DELUSIONS %
27400
27500 EXPR DELTALK (STMT);
27600 IF NOT SKEP THEN
27700
27800 % NO LOCAL CONTEXT OF SKEPTICISM %
27900
28000 IF MEMBER1 (GET ('DISBELIEF, 'IND), STMT) THEN
28100
28200 % 'OTHER EXPRESSES DISBELIEF OF 'SELF'S DELUSIONS %
28300
28400 BEGIN
28500 AJUMP←0.3;
28600 FJUMP←0.1;
28700 SAY (CHOOSE ('BELIEVEREPLIES));
28800 SKEP←T;
28900 END
29000
29100 % CHECK FOR SPECIFIC QUESTION ABOUT DELUSIONS
29200 OR OTHER QUESTIONS %
29300
29400 ELSE SPECQUES (STMT) OR SAY (ANSWER (STMT))
29500 ELSE
29600 BEGIN
29700
00100 % IF FOLLOW-UP TO SKEPTICAL REMARK IS REASSURANCE,
00200 CONTINUE EXPRESSING DELUSIONS %
00300
00400 IF YES (STMT) THEN SAY (DELSTMT ())
00500 ELSE SAY (DISTRUST ());
00600 SKEP←NIL;
00700 END;
00800
00900 %
01000 FEARMODE PROVIDES FEARFUL REACTIONS TO STATEMENTS OF 'OTHER %
01100
01200 EXPR FEARMODE ();
01300 BEGIN
01400 TERPRI NIL;
01500 IF FEAR GREATERP 18.4 THEN SAY ('((EXITS)))
01600
01700 % DISTINGUISH BETWEEN QUESTIONS AND STATEMENTS OF 'OTHER %
01800
01900 ELSE QTHREAT (REMARK) OR SAY (CHOOSE ('AFRAID));
02000 END;
02100
02200 %
02300 FLAREREF HANDLES FLARE REFERENCES %
02400
02500 EXPR FLAREREF (INP);
02600 BEGIN
02700
02800 % CHECK FOR NEW FLARE AND RECORD AS "OLD" %
02900
03000 IF CHECKFLARE (INP, LIVEFLARES) THEN FLRECORD (GET (FLARE, 'SET));
03100
03200 % CHECK FOR OLD FLARE %
03300
03400 IF CHECKFLARE (INP, DEADFLARES) THEN
03500
03600 % RESPOND TO FLARE %
03700
03800 RETURN PROG2 (SAY (FLTALK (GET (FLARE, 'SET), 'Q CONS GET (FLARE, 'SET) CONS INP)), T);
03900 END;
04000
04100 %
04200 FLTALK %
04300
04400 EXPR FLTALK (FLSET, INP);
04500 IF FEAR GREATERP 17 OR ANGER GREATERP 17 THEN
04600 PROG2 (FLARE←'INIT, CHOOSE ('CHANGESUBJ))
04700
04800 % TRY TO ANSWER QUESTION ABOUT FLARE %
04900
05000 ELSE ANSWER (INP);
05100
05200 %
05300 IYOUME HANDLES INTERPERSONAL ATTITUDE STATEMENTS
05400
05500 THIS IS AN UNINTELLIGIBLE TEMPORARY ROUTINE WHICH REPRESENTS
05600 EXPERIMENTAL EFFORTS TO DISCOVER THE CASES WHICH MUST BE
05700 DISTINGUISHED IN DETERMINING THE MEANING OF THE INPUT %
05800
05900 EXPR IYOUME (INP);
06000 BEGIN
06100 NEW S, WD, SACT, ATTITUDE, AWORD, NWORDS, COUNT, REPLY;
06200 SPECIAL REPLY;
06300 TVAL←T;
06400 NWORDS←0;
06500
06600 % COLLECT RELEVANT ITEMS IN INPUT %
06700
06800 FOR WD IN INP DO
06900 IF WD EQ 'YOU OR WD EQ 'I OR WD EQ 'ME THEN PROG2 (S←WD CONS S, IF ATTITUDE THEN COUNT←NIL)
07000 ELSE
07100 IF WD MEMBER NLIST THEN TVAL←NOT TVAL
07200 ELSE
07300 IF WD MEMBER SACTS AND NOT SACT THEN
07400 PROG2 (SACT←WD CONS S, S←SUFLIST (S,2))
07500 ELSE
07600 IF NOT ATTITUDE AND ATTITUDE←GET (WD, 'ATTIT) THEN
07700 BEGIN
07800 S←(AWORD←WD) CONS S;
07900 NWORDS←0;
08000 COUNT←T;
08100 END
08200 ELSE
08300 IF COUNT THEN NWORDS←NWORDS + 1
08400 UNTIL LENGTH S = 3;
08500
08600 % TRANSFORM E.G. (I BELIEVE) (YOU) INTO (I BELIEVE YOU) %
08700
08800 IF SACT AND LENGTH S LESSP 2 THEN
08900 IF NOT ATTITUDE AND (ATTITUDE←GET (AWORD←CAR SACT, 'ATTIT)) THEN
09000 S←S @ SACT
09100 ELSE RETURN NIL;
09200
09300 % CHECK NO. OF WORDS BETWEEN ATTITUDE AND OBJECT %
09400
09500 IF NWORDS GREATERP 3 THEN RETURN NIL;
09600 IF GET (AWORD, 'NEG) THEN TVAL←NOT TVAL;
09700
09800 % CHECK FOR GENERAL ATTITUDE, E.G. (YOU ANGRY) %
09900
10000 IF LENGTH S LESSP 3 THEN
10100 IF S[2] EQ 'YOU AND S[1] EQ AWORD AND NOT GET (AWORD, 'FLIP) AND NOT GET (AWORD, 'RELN) THEN
10200 IF CAR INP EQ 'Q THEN PROG2 (INTERPERS←T, REPLY←ANSWER (INP))
10300 ELSE REPLY←CHOOSE ('SEEM)
10400 ELSE RETURN NIL
10500 ELSE
10600
10700 % CHECK FOR "YOU <ATTITUDE> ME" SITUATIONS %
10800
10900 IF S[3] EQ 'YOU AND S[2] EQ AWORD AND NOT GET (AWORD, 'FLIP) AND S[1] EQ 'ME OR
11000 S[3] EQ 'I AND GET (S[2], 'FLIP) AND S[1] EQ 'YOU OR
11100 S[3] EQ 'I AND S[2] EQ 'YOU AND S[1] EQ AWORD AND NOT GET (AWORD, 'FLIP) THEN
11200 IF NOT GET (AWORD, 'RELN) OR CAR S EQ 'ME THEN
11300 REPLY←CHOOSE (IF TVAL THEN ATTITUDE CONS 'YMREPLIES ELSE GET (ATTITUDE, 'OPP) CONS 'YMREPLIES)
11400 ELSE NIL
11500 ELSE
11600
11700 % CHECK FOR "I <ATTITUDE> YOU" SITUATIONS %
11800
11900 IF S[3] EQ 'I AND S[2] EQ AWORD AND NOT GET (AWORD, 'FLIP) AND S[1] EQ 'YOU OR
12000 S[3] EQ 'YOU AND GET (S[2], 'FLIP) AND S[1] EQ 'ME OR
12100 S[3] EQ 'YOU AND S[2] EQ 'ME AND S[1] EQ AWORD AND NOT GET (AWORD, 'FLIP) THEN
12200
12300 % TREAT REFERENCES TO SELF'S OPINION SIMILARLY TO AFFIRMATIVE
12400 STATEMENTS BY THE OTHER, AS FAR AS SELF'S ANSWER IS CONCERNED %
12500
12600 IF (CAR INP EQ 'Q OR SACT) AND CAR LAST SACT EQ 'YOU OR TVAL THEN
12700 REPLY←CHOOSE (ATTITUDE CONS 'IYREPLIES)
12800 ELSE
12900 BEGIN
13000 REPLY←CHOOSE (GET (ATTITUDE, 'OPP) CONS 'IYREPLIES);
13100 FJUMP←0.1;
13200 AJUMP←0.2;
13300 END;
13400 IF REPLY THEN RETURN PROG2 (SAY (REPLY), T);
13500 END;
13600
13700 %
13800 NORMAL HANDLES STATEMENT OF 'OTHER IN THE ABSENCE OF
13900 PROVOCATIVE INPUT %
14000
14100 EXPR NORMAL (STATEMENT);
14200 IF FEAR GREATERP 14 THEN FEARMODE ()
14300 ELSE
14400 IF ANGER GREATERP 14 THEN ANGERMODE ()
14500 ELSE
14600 IF DELFLAG THEN DELTALK (STATEMENT)
14700 ELSE
14800 PROMPT (STATEMENT);
14900
15000 %
15100 PERSREL %
15200
15300 EXPR PERSREL (INP);
15400 IYOUME (INP) OR APOLOG (INP) OR THREAT (INP);
15500
15600 %
15700 SELFREF SCANS THE INPUT SENTENCE FOR DIRECT OR INDIRECT REFERENCE TO THE SENSITIVE
15800 AREAS OF 'SELF AND CALLS FOR THE APPROPRIATE REPLY. IF NO SELF-REFERENCE
15900 IS PERCEIVED, NIL IS RETURNED. %
16000
16100 EXPR SELFREF (INP);
16200 BEGIN
16300 NEW YOU, NEG, FOUND, ADJ, CONCEPT, WORD;
16400
16500 % CHECK FOR DIRECT REFERENCE TO 'SELF %
16600
16700 IF MEMBER1(GET('YOUWORDS, 'IND), INP) THEN YOU←T;
16800
16900 % CHECK FOR EXPLICIT NEGATORS %
17000
17100 IF MEMBER1 (NLIST, INP) THEN NEG←T;
17200
17300 % CHECK FOR GENERAL INSULTS OR COMPLIMENTS %
17400
17500 FOR WORD IN INP DO
17600
17700 % CHECK 'YOU-NEGATION-INSULT' COMBINATIONS %
17800
17900 FOUND←IF WORD MEMBER GET ('INSULT, 'IND) THEN
18000 IF YOU THEN
18100 IF NOT NEG THEN PROG2 (AJUMP←0.8, CHOOSE ('ANGER))
18200 ELSE
18300 PROG2 (IF MISTRUST GREATERP 9 THEN AJUMP←0.2, CHOOSE ('DISTANCE))
18400 ELSE PROG2 (AJUMP←0.3, CHOOSE ('PERS))
18500 ELSE
18600
18700 % CHECK 'YOU-NEGATION-COMPLIMENT' COMBINATIONS %
18800
18900 IF WORD MEMBER GET ('COMPL, 'IND) THEN
19000 IF YOU THEN
19100 IF NOT NEG THEN
19200 PROG2 (IF MISTRUST GREATERP 9 THEN AJUMP←0.2,
19300 CHOOSE ('DISTANCE))
19400 ELSE
19500 PROG2 (AJUMP←0.7, CHOOSE ('HOSTILEREPLIES))
19600 ELSE PROG2 (AJUMP←0.5, CHOOSE ('SENSREPLIES) @ (WORD CONS '(??)))
19700 UNTIL FOUND;
19800
19900 IF FOUND THEN RETURN (PROG2 (SAY (FOUND), T));
20000
20100 % CHECK FOR POSITIVE OR NEGATIVE REFERENCE TO 'SELF IN SENSITIVE AREA %
20200
20300 ADJ←ADJTYPE (INP); % DETERMINE PRESENCE OF POS OR NEG ADJECTIVE %
20400 FOR WORD IN INP DO
20500
20600 % 'SPECIAL DENOTES PERSONAL SENSITIVE AREA, E.G. APPEARANCE %
20700
20800 IF (CONCEPT←GET (WORD, 'SET)) MEMBER SENSITIVELIST THEN
20900 FOUND←IF (NOT GET (CONCEPT, 'SPECIAL)) AND (CAR (INP) EQ 'Q) AND YOU THEN
21000 PROG2 (AJUMP←0.2, ANSWER (INP))
21100 ELSE
21200 IF YOU AND (GET (ADJ, 'TYPE) EQ 'NEG) THEN
21300 IF NOT NEG THEN
21400 PROG2 (AJUMP←0.7, CHOOSE ('HOSTILEREPLIES))
21500 ELSE
21600 PROG2 (IF MISTRUST GREATERP 9 THEN AJUMP←0.3, CHOOSE ('DISTANCE))
21700 ELSE
21800 IF YOU AND (GET (ADJ, 'TYPE) EQ 'POS) THEN
21900 IF NOT NEG THEN
22000 PROG2 (IF MISTRUST GREATERP 9 THEN AJUMP←0.3,
22100 CHOOSE ('DISTANCE))
22200 ELSE
22300 PROG2 (AJUMP←0.7, CHOOSE ('HOSTILEREPLIES))
22400 ELSE
22500 IF YOU AND (GET (CONCEPT, 'SPECIAL) OR GET (ADJ, 'TYPE)) THEN
22600 BEGIN
22700 AJUMP←0.5;
22800 CONCEPT←<CONCEPT>;
22900 RETURN (CHOOSE ('DEFENSREPLIES) @ CONCEPT);
23000 END
23100 ELSE
23200 IF GET (ADJ,'TYPE) THEN
23300 PROG2 (AJUMP←0.5, SELFREFREPLY (ADJ, WORD))
23400 ELSE
23500 IF GET (CONCEPT, 'SPECIAL) THEN
23600 PROG2 (AJUMP←0.4, CHOOSE ('PERS))
23700 ELSE
23800 BEGIN
23900 AJUMP←0.2;
24000 CONCEPT← <CONCEPT>;
24100 RETURN (CHOOSE ('GUARD) @ CONCEPT);
24200 END
24300 ELSE NIL
24400 UNTIL FOUND;
24500 IF FOUND THEN RETURN (PROG2 (SAY (FOUND), T));
24600 END;
24700
24800 % 'TALK' ROUTINES FOR TWO TELETYPES %
24900
25000
25100 FEXPR OUT (L); % L = (DESTINATION FUNCTION OPEN CLOSE) %
25200 IF L[1] EQ 'DOC THEN SEND_MAIL('DOCJOB, L[2]) ELSE
25300 IF L[1] EQ 'OWN THEN EVAL L[2]
25400 ELSE BEGIN
25500 IF LENGTH L ≥ 3 & L[3] THEN EVAL <'OUTPUT, '(4 KMC), EVAL L[1]>;
25600 OUTC(T, NIL);
25700 EVAL L[2];
25800 OUTC(NIL, IF LENGTH L = 4 THEN L[4] ELSE NIL);
25900 END;
26000
26100 FEXPR INP (L); % L = (SOURCE FUNCTION) %
26200 IF L[1] EQ 'DOC THEN SEND_MAIL('DOCJOB, <'SEND_MAIL, '(QUOTE HAR000), L[2]>) ALSO WAIT_FOR_MAIL(L[3])
26300 ELSE EVAL L[2];
26400
26500 EXPR READ_MESSAGE ();
26600 BEGIN NEW L;
26700 PRINTSTR "READY:";
26800 DO NIL UNTIL CAR(L ← READCH() CONS L) EQ LF & CADR L EQ CR
26850 & CADDR L EQ LF & CADDDR L EQ CR;
26900 RETURN REVERSE CDDDDR L
27000 END;
27100
27200 EXPR PRINT_MESSAGE (MESSAGE); TERPRI TERPRI FOR NEW CH IN MESSAGE DO PRINC CH;
27300
27400 EXPR PRINT_ALL (FILE); % COPIES FILE "FILE" TO THE CURRENTLY OPEN OUTPUT FILE. %
27500 BEGIN NEW CH;
27600 EVAL <'INC, <'INPUT, '(4 KMC), FILE>, NIL>;
27700 DO NIL UNTIL TYO TYI() EQ OCTAL 45 & (ATOM(CH ← ERRSET(READCH(),T)) | PRINC CAR CH & NIL);
27800 INC(NIL,T)
27900 END;
00100
00200 % ***** AUXILIARY FUNCTIONS ***** %
00300
00400
00500 %
00600 ADJTYPE RETURNS AND TRIES TO IDENTIFY ANY VALUE-TYPE MODIFIERS IN STATEMENT %
00700
00800 % TO BE REWRITTEN %
00900
01000 EXPR ADJTYPE (STMT);
01100 BEGIN
01200 NEW WORD, TYPE, FOUND;
01300 FOR WORD IN STMT DO
01400 FOR TYPE IN '(POS NEG AMBIG) DO
01500 IF WORD MEMBER GET ('ADJLIST, TYPE) THEN
01600 FOUND←PROG2 (PUTPROP (WORD, TYPE, 'TYPE), WORD)
01700 UNTIL FOUND
01800 UNTIL FOUND;
01900 RETURN (WORD);
02000 END;
02100
02200 %
02300 ANSVAR ALTERNATIVELY SELECTS ONE OF TWO VARIANTS OF AN ANSWER %
02400
02500 EXPR ANSVAR (KEYWD);
02600 BEGIN
02700 NEW A;
02800 IF NULL A←GET (KEYWD, 'A) THEN RETURN
02900 IF FLARE EQ 'INIT THEN CHOOSE ('EXHAUST)
03000 ELSE FLSTMT (GET (FLARE, 'SET))
03100 ELSE
03200 IF NOT ATOM CAR A THEN
03300
03400 % 'A' CONSISTS OF A LIST OF 2 ANSWERS: ((---)(---))
03500 RATHER THAN OF AN ANSWER: (---) %
03600
03700 RETURN CHOOSE (KEYWD CONS 'A)
03800 ELSE RETURN A;
03900 END;
04000
04100 %
04200 ANSWER HANDLES QUESTIONS OF 'OTHER:
04300 IF NO RECOGNIZED TOPIC ABOUT 'SELF IS BEING CONTINUED AND NO REFERENCE
04400 TO 'SELF IS DETECTED, THE QUESTION IS TREATED AS MISCELLANEOUS;
04500 OTHERWISE AN ANSWER TO THE QUESTION IS ATTEMPTED %
04600
04700 EXPR ANSWER (Q);
04800 BEGIN
04900 NEW ANS, WORD, CONCEPT;
05000
05100 SPECIAL ANS, QWORD;
05200
05300 % "INTERROGATIVE IMPERATIVES" ARE CONSIDERED AS QUESTIONS ABOUT 'SELF %
05400
05500 IF ('TELL MEMBER Q) THEN
05600 Q←('Q CONS 'YOU CONS Q)
05700 ELSE
05800
05900 % STATEMENTS THAT THE 'OTHER HAS A QUESTION ARE CONSIDERED AS QUESTIONS %
06000
06100 IF MEMBER1 (GET ('QUES, 'IND), Q) THEN
06200 Q←'Q CONS 'QUESTION CONS Q
06300 ;
06400
06500 % IF INPUT IS A QUESTION AND NO TOPIC IS CURRENTLY UNDER DISCUSSION
06600 AND INPUT REFERS TO SELF, EXPECT ONLY QUESTIONS RELATING
06700 TO A MAIN "SELF-TOPIC" %
06800
06900 IF CAR Q EQ 'Q AND QWORD EQ 'INTROTOP AND MEMBER1(GET('YOUWORDS, 'IND), Q) THEN
07000 ANS←ANSWER1 (Q, GET ('INTROTOP, 'Q))
07100 ELSE
07200
07300 % IF ALREADY ON SOME TOPIC, CHECK FIRST FOR NEW MAIN TOPIC,
07400 THEN FOR FOLLOW-UP TO LAST SUBTOPIC, THEN (UNLESS SUBTOPIC =
07500 MAIN TOPIC) FOR FOLLOW-UP TO LAST MAIN TOPIC %
07600
07700 IF QWORD NEQ 'INTROTOP THEN
07800 (IF MEMBER1 ('(YOU YOUR), Q) THEN ANS←ANSWER1 (Q, GET ('INTROTOP, 'Q))) OR (ANS←ANSWER2 (Q)) OR
07900 IF QWORD NEQ LASTTOP THEN ANS←PROG2 (QWORD←LASTTOP, ANSWER2 (Q))
08000 ;
08100 IF NOT ANS THEN
08200
08300 % NO QUESTIONS RECOGNIZED %
08400
08500 BEGIN
08600 ANS←IF CAR Q EQ 'Q THEN MISCQ (Q) ELSE MISCS (Q);
08700
08800 % REINITIALIZE TOPIC INDICATORS %
08900
09000 LASTTOP←QWORD←'INTROTOP;
09100 END;
09200 ASCAN (ANS, Q);
09300 RETURN (ANS);
09400 END;
09500 %
09600 ANSWER1 %
09700
09800 EXPR ANSWER1 (Q, TOPICS);
09900 BEGIN
10000 NEW CONCEPT, SPEC, ANS;
10100 SPECIAL ANS, QWORD;
10200 % TRY TO MATCH WORDS OF QUESTION WITH ONE OF THE SELF-TOPICS %
10300
10400 FOR CONCEPT IN TOPICS DO
10500 IF MEMBER1 (CONCEPT, Q) THEN
10600 BEGIN
10700
10800 % CHECK FOR SPECIFIC QUESTION ABOUT TOPIC
10900 MENTIONED IN THIS SENTENCE %
11000
11100 FOR SPEC IN GET (LASTTOP←CAR (CONCEPT), 'Q) DO
11200 IF MEMBER1 (SPEC, Q) THEN % QUESTION ABOUT MAIN TOPIC RECOGNIZED %
11300 ANS←ANSVAR (QWORD←CAR SPEC)
11400 UNTIL ANS;
11500
11600 IF NOT ANS THEN
11700
11800 % NO SPECIFIC QUESTION ABOUT THIS MAIN TOPIC RECOGNIZED %
11900
12000 BEGIN
12100
12200 % SAVE TOPIC KEY WORD %
12300
12400 QWORD←CAR (CONCEPT);
12500
12600 % GET ANSWER ASSCIATED WITH TOPIC KEY WORD %
12700
12800 ANS←ANSVAR (QWORD);
12900 END;
13000 END
13100 UNTIL ANS;
13200 RETURN (ANS);
13300 END;
13400 %
13500 ANSWER2 %
13600
13700 EXPR ANSWER2 (Q);
13800 BEGIN
13900 NEW CONCEPT, ANS;
14000 SPECIAL QWORD;
14100
14200 % CHECK FOR SPECIFIC QUESTION ABOUT TOPIC
14300 MENTIONED IN THE PRECEDING SENTENCE %
14400
14500 FOR CONCEPT IN GET (QWORD, 'Q) DO
14600 IF MEMBER1 (CONCEPT, Q) THEN
14700 ANS←ANSVAR (QWORD←CAR CONCEPT)
14800 UNTIL ANS;
14900 RETURN (ANS);
15000 END;
15100
15200 %
15300 APOLOG RESPONDS DIFFERENTIALLY TO APOLOGIES ACCORDING TO MISTRUST LEVEL %
15400
15500 EXPR APOLOG (STMT);
15600 IF MEMBER1 (GET ('APOL, 'IND), STMT) THEN
15700 BEGIN
15800 IF MISTRUST GREATERP 9 THEN
15900 AJUMP←0.2
16000 ELSE ANGER ← ANGER-1;
16100 SAY (CHOOSE ('ACCUSE));
16200 RETURN (T);
16300 END;
16400
16500 %
16600 ASCAN SCANS 'SELF'S ANSWER FOR MENTION OF FLARE OR MAFIA %
16700
16800 EXPR ASCAN (ANS, Q);
16900 BEGIN
17000 IF CHECKFLARE (ANS, LIVEFLARES) THEN FLMOD (GET (FLARE, 'SET));
17100 IF 'MAFIA MEMBER ANS THEN
17200 BEGIN
17300 DELFLAG←T;
17400 FLARE←'INIT;
17500 END;
17600 END;
17700
17800 %
17900 BADINP %
18000
18100 EXPR BADINP (SENT);
18200 BEGIN
18300 TERPRI NIL;
18400 IF '?: ε SENT THEN
18500 RETURN (PROG2 (PRINTSTR (STRINGATE (SENT)), T));
18600 END;
18700
18800 %
18900 BLANKSKIP RETURNS THAT PART OF SENTENCE FOLLOWING ANY SEQUENCE OF LEADING BLANKS,
19000 CARRIAGE RETURNS OR LINE FEEDS %
19100
19200 EXPR BLANKSKIP (SENT);
19300 IF NULL SENT THEN NIL
19400 ELSE
19500 IF CAR SENT EQ BLANK OR CAR SENT EQ CR OR CAR SENT EQ LF THEN BLANKSKIP (CDR SENT)
19600 ELSE SENT;
19700
19800 %
19900 CHOOSE SELECTS THE NEXT REPLY FROM THE RELEVANT GROUP %
20000
20100 EXPR CHOOSE (REPLIES);
20200 BEGIN
20300 NEW REPLY, RESPONSES, IND;
20400 SPECIAL ENDE;
20500 IF NOT ATOM REPLIES THEN
20600 BEGIN
20700 IND←CDR REPLIES;
20800 REPLIES←CAR REPLIES;
20900 END
21000 ELSE IND←'IND;
21100 IF NULL RESPONSES←GET (REPLIES, IND) THEN
21200 RETURN
21300 IF REPLIES EQ 'SILENCE THEN PROG2 (ENDE←T, '((FED UP)))
21400 ELSE
21500 IF REPLIES EQ 'EXHAUST THEN PROG2 (ENDE←T, '((FED UP)) )
21600 ELSE PROG2(CONCEPT←NIL, CHOOSE ('EXHAUST));
21700 REPLY←CAR RESPONSES;
21800 PUTPROP (REPLIES, CDR RESPONSES, IND);
21900 RETURN REPLY;
22000 END;
22100
22200 %
22300 CHOOSEDEL CHOOSES A DELUSIONAL RESPONSE ACCORDING TO "TYPE", WHICH INDICATES
22400 WHETHER THE NEXT GENERAL DELUSION IS TO BE SELECTED (TYPE=NUMBER)
22500 OR A CERTAIN TYPE OF QUESTION IS TO BE ANSWERED %
22600
22700 EXPR CHOOSEDEL (TYPE);
22800 BEGIN
22900 NEW DEL, REPLY, FREQ, OLDF;
23000 IF NUMBERP (TYPE) THEN
23100 DEL←AT ('DEL CAT TYPE)
23200 ELSE DEL←TYPE;
23300 REPLY←IF (OLDF←GET (DEL, 'FREQ)) LESSP 3 THEN
23400 BEGIN
23500 NEW DELN;
23600
23700 % RAISE FREQUENCY %
23800
23900 PUTPROP (DEL, FREQ←OLDF+1, 'FREQ);
24000 DELN←CAR (SUFLIST (GET ('DELUSIONS, DEL), FREQ-1));
24100 RETURN (IF (TYPE = 1) OR (TYPE = 4) THEN % FOR VARIATION ONLY %
24200 GET ('PREFACE, GET (DEL, 'FREQ)) @ DELN
24300 ELSE DELN);
24400 END
24500 ELSE
24600 % 'SELF HAS MENTIONED THIS DELUSION 3 TIMES %
24700 BEGIN
24800 DELFLAG←NIL;
24900 DELEND←T; % DELUSION-END FLAG %
25000 RETURN ('(LET?'S TALK ABOUT SOMETHING ELSE?- I?'VE GIVEN
25100 YOU SOME IDEA OF WHAT?'S GOING ON));
25200 END;
25300 RETURN (REPLY);
25400 END;
25500
25600 %
25700 DELCHECK RETURNS ANY NEW DELUSION-EXPRESSIONS FOUND IN INPUT AND DELETES AS SUCH %
25800
25900 EXPR DELCHECK (INP);
26000 BEGIN
26100 NEW WORDS;
26200
26300 % CHECK FOR STRONG DELUSION-NOUNS AND -VERBS
26400 (AT PRESENT THE NOUN-VERB DISTINCTION IS NOT UTILIZED %
26500
26600 IF WORDS←MEMBER1 (DELNLIST, INP) THEN
26700 DELNLIST←DELETE (WORDS, DELNLIST)
26800 ELSE
26900 IF WORDS←MEMBER1 (DELVLIST, INP) THEN
27000 DELVLIST←DELETE (WORDS, DELVLIST)
27100 ELSE
27200
27300 % CHECK FOR AMBIGUOUS DELUSION WORDS AT HIGH MISTRUST LEVEL %
27400
27500 IF MISTRUST GREATERP 10 AND WORDS←MEMBER1 (DELALIST, INP) THEN
27600 DELALIST←DELETE (WORDS, DELALIST)
27700 ;
27800 RETURN (IF WORDS AND ATOM WORDS THEN WORDS CONS NIL ELSE WORDS);
27900 END;
28000
28100
28200 %
28300 DELETE DELETES WORD WD FROM LIST L %
28400
28500 EXPR DELETE (WD, L);
28600 IF NULL L THEN NIL
28700 ELSE
28800 IF WD EQ CAR (L) THEN CDR (L)
28900 ELSE CAR (L) CONS DELETE (WD, CDR (L));
29000
29100 %
29200 DISTRUST HANDLES FOLLOW-UPS TO LOCAL SITUATIONS OF DISTRUST %
29300
29400 EXPR DISTRUST ();
29500 IF (FEAR GREATERP 10) OR (ANGER GREATERP 10) OR
29600 ((FEAR + ANGER) GREATERP 14) THEN
29700 CHOOSE ('TURNOFF)
29800 ELSE CHOOSE ('ALOOF);
29900
00100 %
00200 FIXPTRS TRANSFERS HIERARCHICAL POINTERS TO NEW FLARE
00300 TO NEXT HIGHER FLARE IN PATH %
00400
00500 EXPR FIXPTRS (FLSET);
00600 BEGIN
00700 NEW CONCEPT;
00800 FOR CONCEPT IN LIVEFLARES @ DEADFLARES DO
00900 IF GET (CONCEPT, 'NEXT) EQ FLSET THEN
01000 PUTPROP (CONCEPT, GET (FLSET, 'NEXT), 'NEXT);
01100 END;
01200
01300 %
01400 FLRECORD NOTES MENTION OF FLARE AND RAISES FEAR %
01500
01600 EXPR FLRECORD (FLSET);
01700 BEGIN
01800 FLMOD (FLSET);
01900 FJUMP←WEIGHT/40.0;
02000
02100 % REINITIALIZE SELF-TOPIC INDICATORS %
02200
02300 LASTTOP←QWORD←'INTROTOP;
02400 END;
02500
02600 %
02700 FLMOD MOVES NEW FLARE FROM "LIVELIST" TO "DEADLIST" AND
02800 ADJUSTS FLARE POINTER HIERARCHY %
02900
03000 EXPR FLMOD (FLSET);
03100 BEGIN
03200 LIVEFLARES←DELETE (FLSET, LIVEFLARES);
03300 DEADFLARES←(FLSET CONS DEADFLARES);
03400 FIXPTRS (FLSET);
03500 END;
03600
03700 %
03800 FLARELEAD DECIDES WHAT TYPE OF "SUSPICIOUSNESS" REPLY IS SUITED
03900 TO INTRODUCE THE FLARE CONCEPT %
04000
04100 EXPR FLARELEAD (FLSET);
04200 BEGIN
04300 IF GET (FLSET, 'TYPE) EQ 'INSTITUTION THEN
04400 RETURN (CHOOSE ('NEXTFL) @ '(THE) @
04500 <CAR (GET (FLSET, 'WORDS))>)
04600 ELSE
04700 RETURN (CHOOSE ('NEXTFL) @
04800
04900 % DO NOT TREAT SINGULARS AS A GENERIC TOPIC %
05000
05100 (IF CAR (LAST (EXPLODE (FLARE))) EQ 'S THEN <FLARE>
05200 ELSE <CAR (GET (FLSET, 'WORDS))>)
05300 );
05400 END;
05500
05600 %
05700 FLSTMT PROVIDES NEXT STATEMENT ABOUT FLARE %
05800
05900 EXPR FLSTMT (FSET);
06000
06100 % IF REACH 'MAFIASET THRU FLARE HIERARCHY, ENTER DELUSIONAL MODE %
06200
06300 IF (FSET EQ 'MAFIASET) AND NOT DELEND THEN
06400 PROG2 (DELFLAG←T, DELSTMT ())
06500 ELSE
06600 IF (NREF←GET (FSET, 'NREF)) LESSP 2 THEN
06700 BEGIN
06800 PUTPROP (FSET, NREF←(NREF+1), 'NREF);
06900
07000 % MAKE NEXT STATEMENT ABOUT CURRENT FLARE TOPIC %
07100
07200 RETURN (CAR (SUFLIST (GET (FSET, 'STMTS), NREF-1)));
07300 END
07400
07500 % GO TO NEXT FLARE TOPIC %
07600
07700 ELSE LEADON (GET (FSET, 'NEXT))
07800 ;
07900
08800 %
08900 LEADON %
09000
09100 EXPR LEADON (NEWSET);
09200 BEGIN
09300 IF NEWSET NEQ 'MAFIASET THEN
09400
09500 % RECORD NEW FLARE %
09600
09700 BEGIN
09800 FLMOD (NEWSET);
09900 FLARE←CAR (GET (NEWSET, 'WORDS));
10000 END
10100 ELSE
10200 IF DELEND THEN
10300
10400 % ARRIVE AT 'MAFIASET BUT THROUGH WITH DELUSIONS %
10500
10600 RETURN (PROG2 (FLARE←'INIT, CHOOSE ('FEELER)))
10700 ELSE
10800 IF WEAK OR (FEAR GREATERP 17) OR (ANGER GREATERP 17) OR
10900 ((FEAR + ANGER + MISTRUST) GREATERP 40) THEN
11000
11100 % ARRIVED AT 'MAFIASET BUT DOES NOT HAVE DELUSIONS ABOUT
11200 MAFIA OR IS UNWILLING TO DISCUSS THEM %
11300
11400 RETURN (CHOOSE ('CHANGESUBJ))
11500 ELSE
11600 BEGIN
11700 DELETE ('MAFIA, DELNLIST);
11800 DELFLAG←T;
11900 FLARE←'INIT;
12000 END;
12100
12200 % RESPOND WITH NEW FLARE %
12300
12400 RETURN (FLARELEAD (NEWSET));
12500 END;
12600
12700 %
12800 MEMBER1 CHECKS WHETHER ATOMS OR GROUPS OF WORDS IN WLIST ARE PRESENT IN INPUT %
12900
13000 EXPR MEMBER1 (WLIST, SPECIAL INP);
13100 BEGIN
13200 NEW FOUND, GROUP;
13300 FOR GROUP IN WLIST DO
13400 FOUND←IF ATOM (GROUP) THEN GROUP MEMBER INP
13500 ELSE
13600 EVAL ('AND CONS MAPCAR (FUNCTION (LAMBDA (X); X MEMBER INP), GROUP))
13700 UNTIL FOUND;
13800 IF FOUND THEN RETURN GROUP;
13900 END;
14000
14100 %
14200 MISCQ TRIES TO DETECT AND ANSWER CERTAIN RECOGNIZABLE QUESTIONS.
14300 IF IT FAILS, IT TRIES TO DISCERN WHETHER THE QUESTION CONTAINS
14400 INTERROGATIVE WORDS REQUIRING A SPECIFIC ANSWER, OR WHETHER IT
14500 REQUIRES A GENERAL YES- OR NO-TYPE ANSWER,
14600 AND CALLS FOR AN APPROPRIATE REPLY %
14700
14800 EXPR MISCQ (Q);
14900 BEGIN
15000 NEW QWORD, ANS, CONCEPT;
15100 IF SUFLIST (Q, LENGTH Q - 3) = '(HOW ARE YOU) THEN ANS←'(ALL RIGHT)
15200 ELSE
15300
15400 % INTERPERSONAL ATTITUDE MAY HAVE BEEN SET IN IYOUME IN CONTEXT OF 'YOU <ATTITUDE>' %
15500
15600 IF INTERPERS THEN RETURN PROG2 (INTERPERS←NIL,
15700 IF MEMBER1 (GET ('QLIST, 'IND), Q) THEN CHOOSE ('WFEEL)
15800 ELSE CHOOSE ('QFEEL) )
15900 ELSE
16000
16100 % CHECK FOR QUESTION ABOUT EXTERNAL WORLD %
16200
16300 IF NOT (ANS←OBJQ (Q)) THEN
16400 IF 'HOW MEMBER Q THEN
16500
16600 % UNIDENTIFIABLE "HOW-TYPE" QUESTION %
16700
16800 FOR CONCEPT IN '(MANY MUCH LONG OFTEN) DO
16900 IF CONCEPT MEMBER Q THEN ANS←CHOOSE (CONCEPT)
17000 UNTIL ANS;
17100 IF ANS THEN RETURN (ANS)
17200 ELSE
17300
17400 % IF QUESTION NOT RECOGNIZED, TRY TO ANSWER ACCORDING TO CONTEXT %
17500
17600 IF FLARE NEQ 'INIT THEN RETURN FLSTMT (GET (FLARE, 'SET))
17700 ELSE
17800 IF DELFLAG THEN RETURN DELSTMT ()
17900 ELSE
18000
18100 % WH- QUESTIONS %
18200
18300 IF 'WHY MEMBER Q THEN ANS←CHOOSE ('WHY)
18400 ELSE
18500 FOR QWORD IN GET ('QLIST, 'IND) DO
18600 (ANS← IF QWORD MEMBER Q THEN CHOOSE ('UNKNOWN))
18700 UNTIL ANS;
18800 IF ANS THEN RETURN (ANS)
18900 ELSE
19000
19100 % MISCELLANEOUS "TELL-" QUESTION %
19200
19300 IF ('TELL MEMBER Q) THEN RETURN '(I DON?'T KNOW ANYTHING ABOUT THAT)
19400 ELSE
19500
19600 % NO CLUES - ANSWER NONCOMMITTALLY %
19700
19800 RETURN (CHOOSE ('QREPLIES));
19900 END;
20000
20100 %
20200 MISCS TRIES TO DETECT AND ANSWER CERTAIN RECOGNIZABLE STATEMENTS,
20300 MAINLY IMPERATIVES AND EXPECTED EXPRESSIONS %
20400
20500 EXPR MISCS (S);
20600 IF ('JUMP MEMBER S) THEN '((EXITS))
20700 ELSE
20800 IF (CAR (S) EQ 'HI) OR (CAR (S) EQ 'HELLO) OR (CAR (S) EQ 'HOWDY) OR
20900 CADR S MEMBER '(MORNING AFTERNOON EVENING) THEN '(HELLO)
21000 ELSE
21100 IF (('DOCTOR MEMBER S) OR ('DR MEMBER S)) OR
21200 (('MY MEMBER S) AND ('NAME MEMBER S)) THEN
21300 '(GLAD TO MEET YOU)
21400 ELSE
21500 IF (('ALREADY MEMBER S) OR ('BEFORE MEMBER S)) AND
21600 (('SAID MEMBER S) OR ('MENTIONED MEMBER S)) THEN
21700 '(I GUESS I DID)
21800 ELSE
21900
22000 % LOOK AT CONTEXT OF CONVERSATION %
22100
22200 IF FLARE NEQ 'INIT THEN FLSTMT (GET (FLARE, 'SET))
22300 ELSE
22400 IF DELFLAG THEN DELSTMT ()
22500
22600 % NONCOMMITTAL REPLY %
22700
22800 ELSE CHOOSE ('SREPLIES);
22900
23000 %
23100 MODIFVAR MODIFIES AFFECT VARIABLES AFTER EACH I-O PAIR %
23200
23300 EXPR MODIFVAR ();
23400 BEGIN
23500 RAISE ();
23600
23700 % ACCOUNT FOR NORMAL DROP IN EACH VARIABLE %
23800
23900 ANGER←IF ANGER GREATERP ANGER0 + 1 THEN ANGER - 1 ELSE ANGER0;
24000 IF DELFLAG THEN
24100
24200 % ADD 5 TO BASE VALUE OF FEAR IF DELUSIONS UNDER DISCUSSION %
24300
24400 FEAR←IF FEAR GREATERP FEAR0 + 5.1 THEN FEAR - 0.1 ELSE FEAR0 + 5
24500 ELSE
24600 IF FLARE NEQ 'INIT THEN
24700
24800 % ADD 3 TO BASE VALUE OF FEAR IF FLARES UNDER DISCUSSION %
24900
25000
25100 FEAR←IF FEAR GREATERP FEAR0 + 3.2 THEN FEAR - 0.2 ELSE FEAR0 + 3
25200 ELSE
25300 FEAR←IF FEAR GREATERP FEAR0 + 0.3 THEN FEAR - 0.3 ELSE FEAR0;
25400 MISTRUST←IF MISTRUST GREATERP MISTRUST0+0.05 THEN MISTRUST - 0.05 ELSE MISTRUST0;
25500 IF TRACEV THEN
25600
25700 % PRINT OUT VALUES OF VARIABLES %
25800
25900 BEGIN
26000 TERPRI NIL;
26100 PRINTSTR (" FEAR = " CAT FEAR);
26200 PRINTSTR (" ANGER = " CAT ANGER);
26300 PRINTSTR (" MISTRUST = " CAT MISTRUST);
26400 END;
26500 TERPRI NIL;
26600 END;
26700
26800 %
26900 NULLSKIP RETURNS THAT PART OF SENT FOLLOWYNG AN SEQUENCE OF
27000 BLANKS, CARRIAGE RETURNS, LINE FEEDS, COMMAS OR DASHES %
27100
27200 EXPR NULLSKIP (SENT);
27300 IF (CHAR←CAR SENT) EQ BLANK OR (CHAR EQ CR) OR (CHAR EQ LF) OR (CHAR EQ COMMA) OR (CHAR EQ DASH) THEN
27400 NULLSKIP (CDR SENT)
27500 ELSE SENT;
27600
27700 %
27800 OBJQ HANDLES "OBJECTIVE"-TYPE QUESTIONS
27900 (ABOUT LOCAL EXTERNAL WORLD) %
28000
28100 EXPR OBJQ (Q);
28200 BEGIN
28300 NEW PAIR, FOUND;
28400 IF (('WHAT MEMBER Q) OR ('WHO MEMBER Q) OR ('WHICH MEMBER Q)) AND
28500 FOR PAIR IN GET ('OBJDATA, 'IND) DO
28600 FOUND←IF <CAR (PAIR)> MEMBER1 Q THEN CADR (PAIR)
28700 UNTIL FOUND THEN
28800 RETURN (FOUND);
28900 END;
29000
29100 %
29200 PROMPT HANDLES "TELL-ABOUT-YOURSELF" QUESTIONS %
29300
29400 % TO BE REWRITTEN (KEN REWROTE THIS 11/4/71) %
29500
29600
29700 EXPR PROMPT (INP);
00100 IF MEMBER1 (GET ('DISCUSS, 'IND), INP) AND MEMBER1 (GET ('SELF, 'IND), INP) THEN
00200 BEGIN
00300 NEW ANS;
00400 INP←'TELL CONS INP;
00500 SAY (ANS←ANSWER1 (INP, GET ('INTROTOP, 'Q)));
00600 ASCAN (ANS, INP);
00700 END
00800 ELSE SAY (ANSWER (INP));
00900
01000 %
01100 QTHREAT RESPONDS SUSPICIOUSLY TO QUESTIONS AT HIGH FEAR LEVEL %
01200
01300 EXPR QTHREAT (STMT);
01400 IF CAR (STMT) EQ 'Q THEN PROG2 (SAY (CHOOSE ('THREATQ)), T)
01500 ;
01600
01700 %
01800 RAISE RAISES LEVEL OF RELEVANT AFFECT VARIABLES;
01900 REDUCE JUMP IF IN WEAK VERSION %
02000
02100 EXPR RAISE ();
02200 BEGIN
02300 IF FJUMP THEN
02400 BEGIN
02500 IF WEAK THEN FJUMP←0.3 * FJUMP;
02600 FEAR ← (FEAR + FJUMP * (20 - FEAR));
02700 MISTRUST ← (MISTRUST + (0.5 * FJUMP) * (20 - MISTRUST));
02800 MISTRUST0←MISTRUST0 + 0.1 * FJUMP * (20 - MISTRUST0);
02900 FJUMP←NIL;
03000 END;
03100 IF AJUMP THEN
03200 BEGIN
03300 IF WEAK THEN AJUMP←0.7 * AJUMP;
03400 ANGER ← (ANGER + AJUMP * (20 - ANGER));
03500 MISTRUST ← (MISTRUST + (0.5 * AJUMP) * (20 - MISTRUST));
03600 MISTRUST0←MISTRUST0 + 0.1 * AJUMP * (20 - MISTRUST0);
03700 AJUMP←NIL;
03800 END;
03900 END
04000 ;
04100
04200 %
04300 READSENT RETURNS SCANNED SENTENCE IN THE FORM OF A LIST OF WORDS %
04400
04500
04600 EXPR READSENT (SENT);
04700
04800 % SENT IS A LIST OF INPUT CHARACTERS %
04900
05000 BEGIN
05100 NEW CHAR;
05200 TERMIN←NIL;
05300
05400 % SKIP OVER LEADING CHARACTERS WHICH AREN'T LETTERS OR NUMBERS %
05500
05600 WHILE NOT (GET (CHAR←CAR SENT, 'LET) OR NUMBERP CHAR OR NULL SENT) DO SENT←CDR SENT;
05700 IF NULL SENT THEN TERMIN←'ILL
05800 ELSE RETURN READSENT1 (SCANWD (BLANKSKIP (SENT)));
05900 END;
06000
06100 %
06200 READSENT1 ASSEMBLES REMAINDER OF SENTENCE STARTING AT BEGINNING OF NEXT WORD %
06300
06400
06500 EXPR READSENT1 (WORD);
06600
06700 % WORD IS A LIST OF CHARACTERS COMPRISING 1 WORD AS DETERMINED BY SCANWD %
06800
06900 IF TERMIN THEN PROG2 (RESTSENT←NIL, IF TERMIN EQ 'ILL THEN NIL
07000 ELSE
07100 IF NULL WORD THEN NIL
07200 ELSE <READLIST (WORD)>)
07300 ELSE READLIST (WORD) CONS READSENT1 (SCANWD (RESTSENT));
07400
08700 %
08800 SAY HANDLES OUTPUT OF LIST 'STMT' %
08900
09000 EXPR SAY (STMT);
09100 BEGIN
09200 NEW TEMP;
09300
09400 % IN "SUPPRESS" OR "TALK" VERSION, ELIMINATE LEADING PARENTHETICAL EXPRESSIONS %
09500
09600 IF (SUPPRESS OR TALK) AND ¬ATOM(CAR STMT) THEN
09700 STMT ← CDR STMT;
09800 STMT←STRINGATE (STMT);
09900 OUT (OWN, PRINTSTR STMT);
10000 IF TALK THEN
10100 BEGIN NEW VALUES; SPECIAL VALUES;
10200 OUT (FILE1, PRINTSTR STMT);
10300 VALUES ← EVAL <'INP, 'DOC,
10400 <'PROG, '(X),
10500 <'PRINTSTR, <'QUOTE, AT STMT>>,
10600 '(PRINT (QUOTE RESPONSE?:)),
10700 '(CLEAR_BUFFER),
10800 '(SETQ X (READ)),
10900 '(PRINT (QUOTE PATIENT?:)),
11000 '(CLEAR_BUFFER),
11100 '(RETURN (LIST (QUOTE RESPONSE) X (QUOTE PATIENT) (TERPRI (TERPRI (READ)))))>, T>;
11200 OUT(FILE1, PROG2(PRINT VALUES, PRINC TERPRI EOF), NIL, T);
11300 SAVEJOB('HAR000,'SAV); % SAVE THE CORE IMAGE UNDER HAR000.SAV IN CASE THE SYSTEM GOES DOWN. %
11400
11500 % THIS IS THE POINT AT WHICH THE PROGRAM WILL START IF THE SYSTEM GOES DOWN. %
11600 TEMP ← FILE1;
11700 FILE1 ← FILE2;
11800 FILE2 ←TEMP;
11900 OUT (FILE1, PRINT_ALL( FILE2), T)
12000 END
12100 ELSE IF SAVE_FILE THEN
12200 BEGIN
12300 OUT(FILE1, PRINTSTR STMT);
12400 OUT(FILE1, PRINC TERPRI EOF, NIL, T);
12500 TEMP ← FILE1;
12600 FILE1 ← FILE2;
12700 FILE2 ← TEMP;
12800 OUT(FILE1, PRINT_ALL (FILE2),T)
12900 END
13000 END;
13100
13200 %
13300 SCANWD RETURNS NEXT WORD IN SENT AS LIST OF CHARACTERS %
13400
13500 EXPR SCANWD (SENT);
13600 BEGIN
13700 NEW CHAR;
13800 RETURN
13900 IF (CHAR←CAR SENT) EQ PERIOD OR CHAR EQ '?? THEN
14000
14100 % ILLEGAL FOR TERMINATOR TO BE FOLLOWED BY OTHER CHARACTERS %
14200
14300 PROG2 (TERMIN←IF NOT BLANKSKIP (CDR SENT) THEN CHAR ELSE 'ILL, NIL)
14400 ELSE
14500 IF CHAR EQ BLANK OR CHAR EQ CR OR CHAR EQ COMMA OR CHAR EQ DASH THEN
14600 PROG2 (RESTSENT←NULLSKIP (SENT), NIL)
14700 ELSE
14800 IF NUMBERP (CHAR) OR GET (CHAR, 'LET) THEN
14900 CHAR CONS SCANWD (CDR SENT)
15000 ELSE PROG2 (TERMIN←'ILL, NIL);
15100 END;
15200
15300 %
15400 SELFREFREPLY INTRODUCES VARIATION INTO CHOSEN "SENSITIVE" REPLY %
15500
15600 EXPR SELFREFREPLY (ADJ, NOUN);
15700 BEGIN
15800 NEW REPLY;
15900 FLAG←NOT (FLAG);
16000 REPLY←CHOOSE ('SENSREPLIES) @
16100 (IF FLAG THEN <ADJ> ELSE <ADJ, NOUN>)
16200 @ '(??);
16300 RETURN (REPLY);
16400 END;
16500
16600 %
16700 SENTYPE SETS UP TYPE OF SENTENCE (STATEMENT, QUESTION, ILLEGAL)
16800 TO RETURN FOR PROCESSING %
16900
17000
17100 EXPR SENTYPE (SENT);
17200 IF TERMIN EQ 'ILL THEN '(?: BAD INPUT?; TRY AGAIN?.)
17300 ELSE
17400 IF TERMIN = '?? THEN 'Q CONS SENT ELSE SENT;
17500
17600 %
17700 SPECQUES PROVIDES ANSWERS TO SPECIFIC QUESTIONS RELATED TO THE
17800 DELUSIONAL COMPLEX %
17900
18000 % TO BE REWRITTEN %
18100
18200 EXPR SPECQUES (INP);
18300 BEGIN
18400 NEW WORD, WD, FOUND, QA, PAIR, VALUE;
18500 QA←GET ('ANSWERS, LASTSTMT);
18600 IF QA THEN
18700 FOR PAIR IN QA DO
18800 FOUND←MEMBER1 (CAR (PAIR), INP)
18900 UNTIL FOUND;
19000 IF FOUND THEN
19100
19200 % FOUND KEY WORDS ASSOCIATED WITH LAST DELUSIONAL STATEMENT %
19300
19400 VALUE←BEGIN
19500 LASTSTMT←CADR (PAIR);
19600 RETURN (CHOOSEDEL (CADR (PAIR)));
19700 END;
19800 % AT ANY POINT IN DELUSION DISCUSSION, IF 'WHO' IS NOT OTHERWISE RECOGNIZED,
19900 ASSUME AS REFERRING TO MAFIA %
20000 IF NOT VALUE THEN
20100
20200
20300 IF ((WD←INP[2]) EQ 'WHO) OR (WD EQ 'WHOM) THEN VALUE←'(THE MAFIA);
20400 IF NOT FOUND THEN
20500 IF ('THEY MEMBER INP) AND (('DO MEMBER INP) OR ('ARE MEMBER INP)) AND (LENGTH (INP) LESSP 4)
20600 AND (CAR (INP) EQ 'Q) THEN
20700 VALUE←'(THAT?'S RIGHT);
20800 IF VALUE THEN
20900 BEGIN
21000
21100 % DELETE ANY NEW DELUSIONAL WORDS IN 'SELF'S STATEMENT
21200 FROM DELUSION LIST %
21300
21400 DELCHECK (VALUE);
21500 SAY (VALUE);
21600 END;
21700 RETURN (VALUE);
21800 END;
21900
22000 %
22100 SPECREAX PROVIDES THE APPROPRIATE REACTION OF 'SELF TO SPECIAL TYPES
22200 OF STATEMENT OF 'OTHER %
22300
22400 EXPR SPECREAX (STMT);
22500
22600 IF CAR STMT EQ 'S THEN
22700 PROG2 (SAY (CHOOSE ('SILENCE)), T)
22800 ELSE
22900 IF MEMBER1(GET('YOUWORDS, 'IND), STMT) AND MEMBER1 (GET ('ABNORMAL, 'IND), STMT) THEN
23000
23100 % INSINUATION THAT 'SELF IS MENTALLY ILL %
23200
23300 BEGIN
23400 IF CAR STMT EQ 'Q THEN FJUMP←(AJUMP←0.3)
23500 ELSE FJUMP←(AJUMP←0.5);
23600 SAY (CHOOSE ('ALIEN));
23700 RETURN T;
23800 END;
23900
25200 %
25300 STRINGATE MAKES A STRING OUT OF A QUOTED LIST %
25400
25500 EXPR STRINGATE (L);
25600 FOR NEW WD IN L; CAT WD CAT " ";
25700
25800 %
25900 THREAT %
26000
26100 EXPR THREAT (STMT);
26200 BEGIN
26300 NEW FOUND;
26400 IF FOUND←MEMBER1 (GET ('DELWDS, 'NOUNS) @ GET ('DELWDS, 'VERBS), STMT) THEN
26500 IF MEMBER1 (NLIST, STMT) THEN
26600 BEGIN
26700 FEAR←FEAR-1;
26800 FOUND←CHOOSE ('CAUTION);
26900 END
27000 ELSE
27100 IF 'I MEMBER STMT THEN
27200 BEGIN
27300 FJUMP←0.5;
27400 FOUND←CHOOSE ('PANIC);
27500 END
27600 ELSE FOUND←NIL;
27700 IF FOUND THEN RETURN (PROG2 (SAY (FOUND), T))
27800 ELSE RETURN (NIL);
27900 END;
28000
28100 %
28200 YES SCANS STATEMENT OF 'OTHER FOR AFFIRMATIVE EXPRESSIONS %
28300
28400 % TO BE REWRITTEN %
28500
28600 EXPR YES (INP);
28700 IF GET ('BELIEVEREPLIES, 'IND) THEN
28800
28900 % POSITIVE ANSWER TO QUESTION IS AFFIRMATIVE--
29000 APPLIES TO ALL 'BELIEVEREPLIES USED EXCEPT LAST ONE ON LIST %
29100
29200 (NOT MEMBER1 (GET ('DISBELIEF, 'IND), INP)) AND NOT ('NO MEMBER INP) AND
29300 (('YES MEMBER INP) OR ('CERTAINLY MEMBER INP) OR
29400 ('GUESS MEMBER INP) OR ('SURE MEMBER INP))
29500 ELSE
29600
29700 % NEGATIVE ANSWER TO NEGATIVE STATEMENT IS AFFIRMATIVE %
00100
00200 (NOT MEMBER1 (GET ('DISBELIEF, 'IND), INP)) AND ('NO MEMBER INP)
00300 ;
00400
00500
00600
00700 % ***** MAIN PROGRAM ***** %
00800
00900
01000 INITIALIZE();
01100
01200 PRINTSTR "
01300 END INPUT WITH A PERIOD OR QUESTION MARK, FOLLOWED BY TWO CARRIAGE
01350 RETURNS.
01400 SPELL OUT NUMBERS.
01500 TO INDICATE SILENCE, TYPE 'S.'
01600 WHEN FINISHED, TYPE 'BYE.'
01700 ";
01800
01900
02000 WHILE NOT ENDE DO
02100 BEGIN NEW OK;
02200 INTERPERS←NIL; % REINITIALIZE INTERPERSONAL ATTITUDE %
02300 IF TALK THEN
02400 BEGIN
02500 IF ¬JOB_EXISTS('DOCJOB) THEN
02600 BEGIN
02700 PRINTSTR "THE DOCTOR HAS NOT STARTED RUNNING 'DOCJOB' YET.";
02800 DO SLEEP(30) UNTIL JOB_EXISTS('DOCJOB) | PROG2(PRINTSTR "STILL HASN'T STARTED 'DOCJOB'", NIL);
02900 TERPRI PRINTSTR "OK, HE JUST STARTED IT.";
03000 SLEEP(30) % MAKE SURE HE HAS TIME TO START IT UP. %
03100 END;
03200 MESSAGE ← EXPLODEC INP(DOC, READ_MESSAGE(), NIL);
03300 OUT (OWN, PRINT_MESSAGE (MESSAGE));
03400 OK ← INP(OWN, TERPRI READ()); % T OR NIL %
03500 END;
03600 IF ¬OK THEN MESSAGE ← INP(OWN, READ_MESSAGE());
03700 WHILE BADINP (REMARK←SENTYPE (READSENT (MESSAGE))) DO MESSAGE ← INP(OWN, READ_MESSAGE()) ;
03800 IF TALK | SAVE_FILE THEN OUT (FILE1, PRINT_MESSAGE (TERPRI TERPRI MESSAGE));
03900 IF 'BYE MEMBER REMARK OR FEAR GREATERP 18.4 THEN ENDE ← T
04000 ELSE
04100 BEGIN
04200 SPECREAX (REMARK) OR DELREF (REMARK) OR SELFREF (REMARK) OR FLAREREF (REMARK)
04300 OR PERSREL (REMARK) OR NORMAL (REMARK);
04400 MODIFVAR ();
04500 END;
04600 END;
04700 SAY (IF (DELFLAG OR (FLARE NEQ 'INIT)) AND NOT (FEAR GREATERP 18.4) THEN
04800 PROG2 (AJUMP←0.1, '((OFFENDED) GOOD BYE))
04900 ELSE '(BYE));
05000 TRACEV←T;
05100 MODIFVAR ();
05200 END. _EOF_